gusucode.com > VC 达内MFC例子集源码-源码程序 > VC 达内MFC例子集源码-源码程序/code/20101231/day05.txt

    一 动态创建
  1 动态创建的作用
    创建未知类型的对象.
  2 动态创建的相关
    2.1 必须CObject派生的子孙类
	  2.2 DECLARE_DYNCREATE
	  2.3 IMPLEMENT_DYNCREATE
	3 动态创建的使用
	  3.1 定义类
	  3.2 创建对象
	4 动态创建的实现
	  4.1 代码
	  class CAnimal : public CObject
		{
		public:
			DECLARE_DYNAMIC(CAnimal)
	   	static CObject* PASCAL CreateObject();
		}
		
		CObject* PASCAL CAnimal::CreateObject()
		{ 
			return new CAnimal; 
		}
		
		IMPLEMENT_RUNTIMECLASS(CAnimal, CObject, 0xFFFF, CAnimal::CreateObject)
	  AFX_COMDAT const AFX_DATADEF CRuntimeClass CAnimal::classCAnimal = { 
	  "CAnimal", 
	  sizeof(class CAnimal), 
	  0xFFFF, 
	  &CAnimal::CreateObject, 
	  &CAnimal::_GetBaseClass, 
	  NULL }; 
	     
   4.2 说明
     CAnimal::CreateObject 创建CAniaml
       类的对象
     其他与DYNAMIC的定义相同,只是将
     CAnimal::CreateObject地址保存到
     classCAnimal变量当中。
     
   4.3 实现过程
     pClass->CreateObject()
     4.3.1 获取该类的RuntimeClass变量的
        指针pClass
     4.3.2 调用RuntimeClass的CreateObject
        函数.
     4.3.3 在CreateObject函数中,调用
       m_pfnCreateObject函数指针,这个
       函数指针的地址是该类的CreateObject
       函数的地址.
     4.3.4 在CreateObject函数,会使用new
       操作符,将该类的对象创建并返回.
       
二 文档
  1 MFC文档类作用
    提供数据管理的功能,包括数据的存储
    等功能, 也可以提供文件打开等消息
    处理.
    
  2 MFC文档相关
    CDocument 文档类,父类是CCmdTarget.
       提供了MFC关于文档的封装.
       
  3 MFC文档的使用
    3.1 定义文档类
    3.2 创建文档
    
  4 创建过程
    4.1 CFrameWnd::LoadFrame函数创建
       FrameWnd窗口
    4.2 在CFrameWnd的WM_CREATE消息
      (OnCreate函数)中,调用CFrameWnd
      的OnCreateClient函数.
    4.3 OnCreateClient函数中,会根据
      传入View的RuntimeClass信息,将
      View对象和窗口创建.
    4.4 在CView的WM_CREATE消息
      (OnCreate函数)中,获取到创建参数
      中的CDoument的地址
    4.5 使用CDoument::AddView函数,将
      View的地址保存到Document中,同时
      将Dociment的地址保存到View中
      m_pDocumet成员变量.
      
  5 消息处理
    5.1 添加消息映射宏
    5.2 添加消息处理函数
    5.3 WM_COMMAND命令消息处理顺序
      5.3.1 CView
      5.3.2 CDocument
      5.3.3 CFrameWnd
      5.3.4 CWinApp
    5.4 执行过程
      5.4.1 WM_COMMAND发送到程序的顶层
        窗口FrameWnd
      5.4.2 FrameWnd获取当前活动视图,
        将命令派发给View
      5.4.3 在View中进行消息处理,然后
        派发给CDocument.
      5.4.4 CDocument进行消息处理,返回
        到FrameWnd, FrameWnd自己进行
        消息处理
      5.4.5 派发给CWinApp进行消息处理
      
三 MFC单文档视图应用程序(SDI)

	1 单文档视图
    只能对单个文档进行处理的应用程序.
  
  2 MFC单文档视图相关
    2.1 CWinApp\CFrameWnd\CView\CDocument
    2.2 CDocTemplate - 文档模版类,父类
     是CCmdTarget类.作用是处理框架窗口、
     视图及文档之间的关系。它是一个抽象
     类,不能直接使用。可以使用的是两个
     子类: 
     CSingleDocTemplate - 单文档模板类
     CMultiDocTemplate - 多文档模板类
     
  3 单文档视图的实现
    3.1 创建单文档模版对象
	    CSingleDocTemplate * pTemp = NULL;
	    pTemp = new CSingleDocTemplate( 
	        IDR_MAINFRM,
	        RUNTIME_CLASS( CSdiDocument ),
	        RUNTIME_CLASS( CSdiFrame ),
	        RUNTIME_CLASS( CSdiView) );
    3.2 保存到CWinApp中
	    AddDocTemplate( pTemp );
    3.3 新建文档
 	    OnFileNew( );
 	    
  4 单文档视图创建过程
    4.1 创建 CSingleDocTemplate对象pTemplate,
      同时将FrameWnd/View/Document的
      RUNTIEM_CLASS信息保存:
       CRuntimeClass* m_pDocClass;         // class for creating new documents
	     CRuntimeClass* m_pFrameClass;       // class for creating new frames
	     CRuntimeClass* m_pViewClass;        // class for creating new views
    4.2 调用AddDocTemplate将模版对象
        pTemplate 添加到CWinApp当中.
    4.3 在CWinApp中,将pTemplate保存到
        文档模版管理器m_pDocManager中.
        CDocManager * m_pDocManager;
    4.4 使用CWinApp的OnFileNew等其他
       方式创建文档.
    4.5 在CWinApp的OnFileNew中,调用
       CDocManager的OnFileNew函数
    4.6 在 CDocManager的OnFileNew函数
       查找模板pTemplate.然后调用
       pTemplate的OpenDocumentFile函数
       打开新文档
        pTemplate->OpenDocumentFile( NULL );
    4.7 使用CreateNewDocument函数.创建
       一个文档对象pDocument;
    4.8 使用CreateNewFrame函数以及
       pDocument,创建框架窗口. 
    4.9 创建框架窗口时,使用CFrameWnd的
       LoadFrame函数,将窗口创建.

  5 单文档视图的数据关系
    CWinApp 
      |-> m_pMainWnd 
      |   |-> m_pActiveView
      |       |-> m_pDocument(m_pOnlyDoc)
      |           |-> viewList
      |               |->view指针
      |               |->view...
      |-> m_pDocMananger
         |-> templateList
            |->单文档template
            |  |->文档指针m_pOnlyDoc(m_pDocument)
            |->单文档template...
      
四 MFC多文档视图应用程序(MDI)
  
  1 多文档视图
    只能对多个文档进行处理的应用程序.
 
  2 MFC多文档视图相关
    2.1 CWinApp/CView/CDocument
    2.2 CMDIFrameWnd/CMDIChildWnd
       使用MDI框架窗口,它们的父类
       都是CFrameWnd.
    2.3 CMultiDocTemplate 多文档的
       文档模版类
       
  3 MDI程序创建
    3.1 定义模版对象
      CMultiDocTemplate * pDocTemp = NULL;
      pDocTemp = new CMultiDocTemplate(
            IDR_CHILDFRM, 
            RUNTIME_CLASS( CMdiDocument ),
            RUNTIME_CLASS( CChildFrame ),
            RUNTIME_CLASS( CMdiView ) );
    3.2 保存到CWinApp中
	    AddDocTemplate( pTemp );
    3.3 创建主窗口
      创建CMDIFrameWnd的窗口
    3.4 新建文档
 	    OnFileNew( );